﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.ComponentModel;

namespace TARLib
{
    public class Tavolo : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public Tavolo(string numeroTavolo, ComandaCollection comande)
        {
            NumeroTavolo = numeroTavolo;
            Comande = comande;
        }

        public Tavolo(string numeroTavolo)
        {
            NumeroTavolo = numeroTavolo;
            Comande = new ComandaCollection();

            // Carica da DB una comanda
            SqlConnection conn = new SqlConnection(Database.GetDBConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "[Cucina].[SP_ComandeByTavolo_CL]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@TavoloAssegnato", System.Data.SqlDbType.NVarChar, 20) { Value = NumeroTavolo });

            SqlDataReader dr = null;
            try
            {
                conn.Open();
                dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    Comande.Add(new Comanda(
                        (int)dr["ComandaID"],
                        new ProdottoOrdinatoCollection(),
                        dr["TavoloAssegnato"].ToString(),
                        new CodiceComanda(dr["CodiceComanda"].ToString()),
                        dr["Note"] == DBNull.Value ? null : dr["Note"].ToString(),
                        (Decimal)dr["Sconto"],
                        (DateTime)dr["DataOra"],
                        dr["Autore"].ToString(),
                        new ComandaLogCollection(),
                        dr["CheckInID"] == DBNull.Value ? null : new ComandaCheckIn((int)dr["CheckInID"], (int)dr["ComandaID"], (DateTime)dr["CheckInDataOra"], dr["CheckInAutore"].ToString(), (bool)dr["CheckInEsito"]),
                        dr["StampaRemotaID"] == DBNull.Value ? null : new ComandaStampaRemota((int)dr["StampaRemotaID"], (int)dr["ComandaID"], dr["StampaRemotaStampante"].ToString(), (DateTime)dr["StampaRemotaDataOra"], dr["StampaRemotaAutore"].ToString(), (bool)dr["StampaRemotaEsito"]),
                        dr["ConsegnaID"] == DBNull.Value ? null : new ComandaConsegna((int)dr["ConsegnaID"], (int)dr["ComandaID"], (DateTime)dr["ConsegnaDataOra"], dr["ConsegnaAutore"].ToString(), (bool)dr["ConsegnaEsito"]),
                        new VassoioCollection(),
                        (DateTime)dr["TimeStampMinCheckIn"]));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }

            // A questo punto carica le collection associate
            foreach (Comanda c in this.Comande)
            {
                c.Prodotti.CaricaDaComandaID(c.ComandaID.Value);
                c.Log.CaricaDaComandaID(c.ComandaID.Value);
                c.Vassoi = new VassoioCollection(c.ComandaID.Value);
            }
        }

        public string NumeroTavolo { get; set; }

        public ComandaCollection Comande { get; set; }

        public bool IsCompleto
        {
            get
            {
                return Comande.All(o => o.StatoCorrente == StatoComanda.ConsegnaEffettuata);
            }
        }

        public bool IsNuovo
        {
            get
            {
                if (Comande.Count > 0)
                    return DateTime.Now.Subtract(Comande.Min(o => o.DataOra)) < new TimeSpan(0, 2, 0);
                else
                    return false;
            }
        }

        public void Azzera()
        {
            // Contrassegna il tavolo come "Nuovo"
            // Inserire una riga nel DB?
        }

        public void Update()
        {
            // Aggiorna le comande associate
            Comande = new ComandaCollection();
            SqlConnection conn = new SqlConnection(Database.GetDBConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "[Cucina].[SP_ComandeByTavolo_CL]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@TavoloAssegnato", System.Data.SqlDbType.NVarChar, 20) { Value = NumeroTavolo });

            SqlDataReader dr = null;
            try
            {
                conn.Open();
                dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    Comande.Add(new Comanda(
                        (int)dr["ComandaID"],
                        new ProdottoOrdinatoCollection(),
                        dr["TavoloAssegnato"].ToString(),
                        new CodiceComanda(dr["CodiceComanda"].ToString()),
                        dr["Note"] == DBNull.Value ? null : dr["Note"].ToString(),
                        (Decimal)dr["Sconto"],
                        (DateTime)dr["DataOra"],
                        dr["Autore"].ToString(),
                        new ComandaLogCollection(),
                        dr["CheckInID"] == DBNull.Value ? null : new ComandaCheckIn((int)dr["CheckInID"], (int)dr["ComandaID"], (DateTime)dr["CheckInDataOra"], dr["CheckInAutore"].ToString(), (bool)dr["CheckInEsito"]),
                        dr["StampaRemotaID"] == DBNull.Value ? null : new ComandaStampaRemota((int)dr["StampaRemotaID"], (int)dr["ComandaID"], dr["StampaRemotaStampante"].ToString(), (DateTime)dr["StampaRemotaDataOra"], dr["StampaRemotaAutore"].ToString(), (bool)dr["StampaRemotaEsito"]),
                        dr["ConsegnaID"] == DBNull.Value ? null : new ComandaConsegna((int)dr["ConsegnaID"], (int)dr["ComandaID"], (DateTime)dr["ConsegnaDataOra"], dr["ConsegnaAutore"].ToString(), (bool)dr["ConsegnaEsito"]),
                        new VassoioCollection(),
                        (DateTime)dr["TimeStampMinCheckIn"]));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }

            // A questo punto carica le collection associate
            foreach (Comanda c in this.Comande)
            {
                c.Prodotti.CaricaDaComandaID(c.ComandaID.Value);
                c.Log.CaricaDaComandaID(c.ComandaID.Value);
                c.Vassoi = new VassoioCollection(c.ComandaID.Value);
            }

            // Notifica
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Comande"));
                PropertyChanged(this, new PropertyChangedEventArgs("IsCompleto"));
                PropertyChanged(this, new PropertyChangedEventArgs("IsNuovo"));
            }
        }


    }
}
